約 3,878,679 件
https://w.atwiki.jp/tadaro/pages/657.html
ttp //blacky.futene.net/ 閉鎖
https://w.atwiki.jp/linux2ch/pages/47.html
ネットワークのFAQ ネットワークのFAQ ネットワーク系のコマンド サブネットマスクとかゲートウェイとか何ですか? クラスタ用語 データベースと並列処理 SELinuxとかって何? ネットワークカードや無線LAN機器、LANやネット接続の設定について NIC の 10/100、全二重/半二重 (full-duplex/half-duplex) の設定を確認、変更したい。 無線 LAN ノートブック型PC の場合 無線LANカードを利用する USB 用無線子機を利用する デスクトップ型PC の場合 イーサネット・コンバーターを子機として利用する PCI バス用の無線 LAN ボードを追加する 起動時 eth0 が存在しないというエラーが出る ディストリビューション の PCMCIA や Card Bus 対応情報を知るには? 電波の受信レベルを GNOME に表示させることはできますか。 内蔵無線 LAN (Atheros 社製)を使いたい ネットワーク用各種ユーティリティ LANにつながっているコンピュータを調べたい 外部と接続しないのにホスト名、ドメイン名は必要なの?(ホスト名を変更したい) サービスとポートの一覧表はないですか? あるポート番号を使っているプロセスを知りたい。 DNS無しでLANのマシンの名前を逆引きしたい IP アドレスとドメイン名の変換がしたい。 名前解決ができません!!(ip直指定では接続できます) 先生!! ping コマンドが止まりません!! ネットワークの経路を調べたいんですが。 DHCP接続でIPアドレスを再取得したい 問題発生 ブラウザなどで名前解決が異常に遅いです アプリケーション個別に IPv4 でアクセスする方法 カーネルレベルで IPv6 を無効にする方法 IPv6が動いているか調べる Fedora Core VMware にインストールした時ネットワークが起動しない Vine Linux 無線LANカードが利用できないのですが。 Red Hat Linux Red Hat Linux 9 で再起動すると ADSL がしばらくの間つながらなくなってしまいます。 KNOPPIX 無線LANカードの設定はどこで行なったらよいのですか。 White Box Enterprise Linux ネットワーク・タイムサーバーと時間を同期させることはできますか。 ネットワーク系のコマンド 基本的に、ifconfig(IPアドレスなどネットワークの低水準の設定)、netstat(TCP/UDPパケットの統計表示)、route(ルーティングテーブルの設定)、top(タスクのモニタリング)、vmstat(仮想メモリの状況表示)、iostat(I/Oデバイスの状況表示)は覚えておこう。 ほかにもいろいろとあるからネットで検索してほしい。traceroute(接続経路を表示), nslookupとdig(名前解決), arp(IPアドレスとMACアドレスの対照表であるARPテーブルを表示。IPアドレスはパケットの送受信のアドレスだが、MACアドレスはそれぞれのハードウェアデバイス機器の識別番号)は覚えておいて損はない。 また、ifconfigは低レベルな設定ができるが、使いやすいもっと高レベルなツールやシステムが使われていることが多い。Red Hatならsysconfig、Debianならifupdown。ただし、最近はNetworkManagerを使うことがどちらのディストリビューションでも推奨されている。 ifconfigやnetstatは現在型遅れになりつつあり、今では新しいiproute2パッケージのipとかssコマンドを使えと言われ始めている。 また、ファイアーウォールについては基本的にiptablesを使う。ファイアーウォールでパケットフィルタリングをすることで、不正な通信をブロックできる。他にも、VPNというインターネット回線を使って仮想的な専用のネットワーク(たとえば社内の専用回線的なネットワーク)を作ることのできる技術もある。トンネリングという送信者と受信者をほかから見えないトンネルで繋ぐ技術もある。 またNFSを使うとネットワーク上のファイルシステムをローカルと同じようにマウントできる。 https //linuxjf.osdn.jp/JFdocs/NFS-HOWTO/ NFSはUNIX由来の技術だが、Windowsとmixされた環境で使う場合は、Windowsネットワークのフリーソフトウェア実装であるSambaを使うこともできる。たとえば、Windowsをプリンタサーバにして、Sambaで繋いだりできる。 また、NISを使うことで、ネットワークにつながった各コンピュータで認証情報(ログインユーザ名・パスワード)を共通化できる。UNIXの優れた点はこうしたネットワーク性にあると言われる。NFSとNISはSun Microsystemsによる技術。 ほかに、OpneLDAPを使うことで、ディレクトリと呼ばれるデータベースから、ネットワークに繋がったネットワーク機器やユーザー認証情報などに一元的にアクセスできる。 その他ネットワーク関係の技術としては、WebサーバのApache, Nginx(Apacheにはプロセス・スレッドが10,000を超すと不安定になるC10K問題があり、たくさんのスレッドを作成せずイベント駆動でやりとりするNginxが最近流行っている)や、ProFTPDやvsftpdなどのFTPサーバ、lftpなどのFTPクライアント、Windowsとファイルやプリンタを共有できるSamba、メール関係ソフトウェア(MTA・メールサーバ)のsendmail(設定ファイルの形式が超難解), qmail, postfix, eximなどがある。 また、Linuxでは仮想化システムのDockerを使うことができる。Linuxカーネル上で隔離された仮想化コンテナプロセスを起動することができる。Dockerでは、Linuxカーネルの基本的な設定を引き継ぎながら、プロセスとファイルシステムを隔離し、コンテナ上で実行できる。Docker Hubを使うことで、簡単にRailsサーバなどのコンテナイメージを導入・共有できる。また、Kubernetesを使うことで、ネットワークで繋がったクラスタ環境を一台のホストとして仮想化した上でDockerの仮想化システムを実現できる。使うのは簡単だが概念が難しい(ここまで書いていて意味が分からない人は多いかもしれない)が、実際の開発現場ではDockerは開発環境で本番環境を再現するために使う。RailsサーバとMySQLサーバのように、複数のコンテナを連携させるには、Dockerに加えてYAMLでコンテナの構成情報を記述するDocker Composeを使う。 サーバの管理にはSSHを用いてリモートから接続してコマンドを実行する。以前はtelnetやrloginだったが、これらはパスワードなども含めて平文で送受信するため、公開されたインターネットの普及した現在ではセキュアなシェルとしてSSHを用いる。できるだけパスワード認証を使わず、公開鍵暗号通信を用いること、root認証を許可しないこと、デフォルトのポートを変えることなどがSSHにおけるセキュリティ対策の基本。 サーバマシンでないならXのネットワーク透過を使うとか、GNOMEのCORBAとかD-Busとかの分散システムを使ってネットワーク上のシステムを構築することもできる。CORBAやD-Busは、インターフェース記述言語によって、ネットワーク・言語・プラットフォームの垣根を越えてコンポーネントが通信し合う「分散オブジェクト」と呼ばれる技術。MicrosoftのCOMを元にしている。このような分散システムにはほかにRPC(遠隔手続き呼び出し)やJavaのRMI/JavaBeans/EJBなどがある。 LinuxやFreeBSDなどのUNIXには、タスクがたくさんあって高負荷になってもきちんと動くという特徴がある。このため、クラスタだけではなく、中小から大企業まで、サーバーによく使われる。逆に、WindowsのようなGUIで仕事をするデスクトップOSには不向きである。UNIXはインフラとして使うサーバ、Windowsはゲームの延長線上の仕事をするマシンに使うといいだろう。 サブネットマスクとかゲートウェイとか何ですか? そもそも、インターネットはそれぞれのネットワークが家庭やISPのルータによってつながったもの。 それぞれのルータの接続情報を代表ルータが集約し、ルーティングテーブルという経路表を作り出し、その経路表を全ルータに送る。 パケットのIPアドレスがローカルの中であれば、そのコンピュータにパケットを送信する。外部のものであれば、ルータはどこに送れば宛先に近づけるかを知っているので、ネットワークの外部のルータにそのパケットを送る。 IPアドレスは、そのホストのインターネット上の住所(アドレス)で、パケットの送受信先である。このIPアドレスは、ネットワーク部とホスト部に分かれている。 たとえば、IPアドレスが192.168.0.2である時、これをビットにすると、 11000000 10101000 00000000 00000010 となる。 ネットワーク部とホスト部を識別するために、サブネットマスクを使う。サブネットマスクは、ネットワーク部を1とし、ホスト部を0にしたアドレスのこと。 よって、 11111111 11111111 11111111 00000000 であれば、サブネットマスクは255.255.255.0となる。 また、それぞれのホストのネットワークを共有してくれるアドレス(たとえばルータ)をゲートウェイと言う。 サブネットマスクだけではなく、ブロードキャストアドレスを指定することもある。ブロードキャストアドレスは、パケットをブロードキャストするためだけに存在する。これはネットワーク部と同じアドレスを持ち、ホスト部が1となるアドレスとなる。上記の例では、192.168.0.255となる。 最後に、名前解決がある。このようなビット数値によるアドレスは、機械にとっては理解しやすいが、人間にとっては理解しづらい。そのため、人間に分かりやすい名前(hogehoge.co.jpのような)をつける。ここで、hogehogeの部分をホスト名、co.jpの部分をドメインと呼び、ホスト名は自由につけられる。 名前解決をしてくれるのはDNSという仕組みを用いたネームサーバ。ルータが兼ねていることもあるが、そうでなければISPの指定するネームサーバのアドレスを指定する。ネームサーバは/etc/resolv.confに記述する。DNSを含めてあらゆる名前解決をするソフトウェアのことを「リゾルバ」と呼ぶ。 ルータを用いて家庭内ネットワークを構築する際、静的にIPアドレスを与える(たとえば192.168.0.11ならば11の部分を手動で決める)こともできるが、DHCPを用いれば動的に自動で与えることもできる。DHCPを用いる場合、ネットワーク設定にはDHCPを用いることを指定するだけでよく、管理は楽になるが、IPアドレスがたまに変化することがあり、サーバを公開する場合には向いていない。もし、DHCP環境でサーバを公開する場合、ダイナミックDNSという仕組みを使って、IPアドレスがもし変わった場合はそれを定期的にDNSサーバに通知することができる。 32ビットのIPアドレスが表せるIPv4に比べて、IPv6では128ビットのIPアドレスが表せる。IPv6では石ころにすらIPアドレスがふれるぐらい、多くのアドレスが有り余っているとされる。 クラスタ用語 Linuxはサーバやクラスタにおいてよく使われている。 クラスタについては、性能を重視するHPCクラスタと、信頼性を重視する可用性クラスタがある。Linuxで可用性クラスタをやりたいなら、Heartbeatやその後継のPacemakerが使える。 冗長化とは、サーバのデータ(特にデータベース)をコピーして、一部のデータが破損しても代わりが存在するように多重化すること。 フェイルオーバとは、サーバがダウンしても別のサーバが代わりのサーバを務めること。 ロードバランサとは、サーバの負荷を分散させるため、複数のサーバに処理を分担させる仮想的なサーバのこと。クライアントからの要求を仮想サーバに伝え、クライアントからはロードバランサがサーバであるかのように見える。LinuxではLVSなどのロードバランサ技術がある。 また、仮想サーバのリソースを管理する技術をワークロード管理と呼ぶ。主なワークロード管理ソフトウェア(ジョブスケジューラ)としてSlurmなどがある。 スループットは、単位時間あたりの処理数。これに対してレイテンシとよばれる実際の時間から応答時間を割り出す単位もある。 ネットワークは、大部分が円滑に動いていても、一番細くなっている部分が制限されていると、全体の速度が遅くなる。これをボトルネックと呼ぶ。 IBMのメインフレームのような大型コンピュータは、とても高い信頼性と性能を誇る反面、拡張性が低く、一度作ったシステムを拡張しようと思った時に巨額の追加資金がかかる。こうしたシステムを「中央集約型アーキテクチャ」と呼ぶ。 これに対して、俗に「オープン系」と呼ばれる、UNIXやC/C++/Javaのような「標準的OS・言語」を用いてクラスタを築く方法が増えている。こうしたシステムを「分散型アーキテクチャ」と呼ぶ。 最近は、クラウドと言って、ネットワーク上にコンピュータ資源が存在し、業者が管理する中でそうした「ネットワーク上のリソース」の上でシステムを築く手段も増えている。 だが、クラウドは手軽で安価な反面、物理マシンが自社内になく、管理もしづらいという欠点がある。クラウドに対してオンプレと呼ばれる、「自社内にシステムを構築し、自社で管理する」という方式もとられることが増えている。 最近のエンタープライズシステムは、Webクライアント、Webサーバ、APサーバ、DBサーバで構築されることが多い。これはWebブラウザを端末として使い、サーバを3段階構成にしたもので、LinuxであればApache, Java EE (WebならRuby on Rails), MySQLといった構成が多い。 データベースと並列処理 RDBMSにおいて、SQLを用いたリレーションにより、テーブルを自動的に作成できる。テーブルの主キーは行を一意に特定するが、別のテーブルの主キーを含む列のことを外部キーと呼ぶ。たとえば、学部と名前、名前と電話番号の2つのテーブルがあった時、名前を外部キーとして2つのテーブルを結合し、学部、名前、電話番号のテーブルを自動的に作成する。これを結合と呼ぶ。結合はデータベース操作の基本である関係演算のひとつで、ほかに選択と射影がある。 実際には、同姓同名の場合があるため、名前は外部キーにはできない。同一の項目を入れられないように制約をかけることもできる。 また、テーブルの重複要素を排除し、正しい状態でテーブルを整理することを正規化と呼ぶ。テーブルには、エンティティとリレーションシップがあり、これをE-R図で表す。たとえば、1対1、1対多(ひとつのスレッドにたくさんのコメントがつくような場合)、多対1、多対多のリレーションシップがある。 このようなSQLによるデータベースは、プログラムの中ではデータ構造として格納・構築・参照・変更される。主なデータ構造に、配列(順番に要素を格納する)、連結リスト(要素とポインタを持ち、動的に変化させやすい)、ハッシュ(マップ、辞書、連想配列)、セット(集合)、検索テーブル、行列、スタック(最後に入れたものが最初に出てくる)、キュー(最初に入れたものが最初に出てくる)、ツリー(木構造、たとえば二分探索木などは既出の単語検索の効率化のために使われる)、そしてグラフ(ひとつひとつのノードがエッジと呼ばれる繋がりを表す線で繋がる)などがある。C言語の構造体を用いるときは、データのマッピングだけではなく、効率やパフォーマンスも考える必要がある。 C++のSTLやJavaでは、こうしたデータ構造をテンプレート(ジェネリクス)とともに使う。ArrayListなどのObject型とキャストを用いたプログラミングでは、もしStringを想定しておきながらIntegerが入った場合に、コンパイルエラーにならず、実行時に失敗する。JavaではすべてのクラスがObject型を継承しているため、Object型に頼るプログラミングもできるが推奨されない。このような場合はジェネリクスを使うこと。すべてをObject型として扱う時点で、静的型付け言語を使っている意味がそもそもない。 逆に、RubyやPythonでは動的型付け言語であるため、配列にはどんな要素もミックスして入れることができるし、「アヒルのように振る舞うものはアヒルである」とするダックタイピングもできるが、これは大規模な開発では推奨されたスタイルではない。JavaScriptなどはあえて静的型付けをすることができる言語であるTypeScriptがMicrosoftによって開発されており、JavaScript開発ではTypeScriptを使うことが推奨される場合もある。JavaScriptは「自分でオブジェクトを構築してそれを量産する」というプロトタイプベースのオブジェクト指向を用いているが、TypeScriptを用いることでクラスベースのオブジェクト指向ができる。JavaScriptではthis参照を使うことで委譲もできるが、TypeScriptではクラス継承やジェネリクスやインターフェース(要素となるすべてのメンバと型を指定する)、タプル型(配列のそれぞれの要素に型を指定する。データベースなどを扱う際に有用)や型エイリアス(型の別名。stringをHogeTypeなどとできる)なども用意されている。蛇足だが、JavaScriptで書かれたモジュールは、当然ながら型宣言がない。このようなモジュールをTypeScriptで使うために、型宣言ファイルと呼ばれるものが提供されており、C/C++のヘッダファイルとよく似ている。JavaScriptではDOMを用いてHTML文書の編集はできるが、ファイル処理APIは標準では存在しない。ファイル処理のAPIはサーバーサイド向けのJavaScript環境であるNode.jsで同期・非同期のものが提供されている。 オブジェクト指向において、オブジェクトとRDBMSのマッピングを行うことをO/Rマッピングと呼ぶ。また、オブジェクトをファイルに書き出すことをシリアライズと呼ぶ。データを永続化するための常套手段なので覚えておこう。 データベースは、並列で動かした時のデータの矛盾を無くすため、排他制御やロックを行い、トランザクションが失敗すればロールバックする。同様のことをプログラミング言語でやるならば、Mutexによるロックを使う。 長い間C/C++には標準のマルチスレッドがなかった。そのため、UNIXではpthreadと呼ばれるPOSIXプラットフォーム依存のマルチスレッドを行う。Javaでは標準的にスレッドの機能があり、ThreadクラスまたはRunnableインターフェースを用いることでマルチスレッドのプログラミングができる。Javaではsynchronizedブロック・関数を用いることで、ひとつのスレッドしかアクセスできない(要するにロック)ようにできる。また、Javaではスレッドの一時停止や中断(割り込み)、待機などの機能もあり、例外などの機能とともに使う。 よくある並列処理として、単にマルチスレッドでそれぞれのスレッドが働く場合、マスター・スレーブにより主従関係を用いて複雑な処理を行う場合がある。あるいは、UNIXのパイプのように次々に順番で処理を行うパイプラインモデルがある。 最近では、Promiseやasync/awaitを用いて、非同期処理を行う仕組みもJavaScriptなどに存在する。コールバック関数を使うことでも非同期処理は実現できるため、Windows APIやC#のWindows.Formsなどではコールバック関数を多用するが、用途を考えず多用しすぎると、ネストが深くなり見通しが悪くなる(コールバック地獄)に陥ることがある。JavaScriptではPromiseなどの仕組みを使うことで、基本的には非同期で実行しながら、「この処理が終わったらこの処理をしてね」ということを、resolveとreject、thenとcatchの仕組みで実行できる。async/awaitは同期処理を書く場合と同じようにPromiseの非同期処理を書く記述のスタイル。 高速かつ効率的なアプリケーションを開発するには、ボトルネックとなっている部分を調べること、キャッシュを行うこと、並列処理を行うこと、データ構造を変えること、データを圧縮することなどが言える。言語を単にPythonからC++にすることでも高速化はするが、アルゴリズム的な部分は変わらないため、アルゴリズム的な改良も必要となる。 最近は、Kubernetesを用いることによるマイクロサービスという仕組みが流行している。ひとつのJava EEアプリケーションサーバですべての機能をもたせるのでなく、コンテナごとに機能をもたせてKubernetesを用いてオーケストレーションする。ひとつのサービスがすべてを行うわけでないため、テストなどが容易となる。 SELinuxとかって何? UNIXではrootユーザのほかに一般ユーザが存在するが、rootユーザの絶大な特権を制限する方法がない。 また、ファイルやユーザごとにパーミッションをつけることはできるが、HTTPサーバプロセスなどの「プロセス」に直接アクセスを制限するルールを持たせることができない。 SELinuxでは、rootユーザに制限をかけられるほか、プロセスごとに権限のレベルを制限することができる。 ネットワークカードや無線LAN機器、LANやネット接続の設定について NIC の 10/100、全二重/半二重 (full-duplex/half-duplex) の設定を確認、変更したい。 mii-tool や ethtool を使ってください。 [root@localhost]# ethtool eth0 現在の状態を確認。 [root@localhost]# ethtool -s eth0 duplex full 注意: この手のツールは、モジュールにオプションを渡しているだけである。 そのオプションをカーネルが認識したかどうかは不明である。 ドライバによってはツールでの変更が出来ないものもある。 また、システムの再起動時には設定がクリアされるため 恒常的に変更したいのであれば、マニュアルファイルを読むべきである。 無線 LAN 最近は(有線の)LAN 接続よりも、無線 LAN の導入に関心が集まっています。この問題が主因でクライアントのパソコンに Linux の導入をためらっている方もいるかも知れませんので、参考情報を載せておきます。(追加情報があれば、お願いします。) ノートブック型PC の場合 無線LANカードを利用する orinoco_cs などで対応しているチップを採用した無線LANカードを入手するのが無難でしょう。例えば、次の無線LANカード製品は CentOS 3/4、Debian 3.1/4.0、Fedora Core 1、MEPIS、Mandriva、Red Hat Linux 9 を始めとした多くのディストリビューションで自動認識されるようです。 Buffalo: WLI-PCM-L11, WLI-PCM-L11G, WLI-PCM-L11GP (旧製品。ただし店舗によっては在庫がある模様、また探せば中古品が入手可能) Vine Linux の場合も、上記 Buffalo (旧 Melco) のカードは使えますが、設定が多少ややこしいので詳しくは Vine Linux の該当項目を見てください。 LAN 端子を備えたノートブックであれば、もちろん後述のイーサネット・コンバーターの利用も検討できます。デスクトップと共用できるので、使い回しが効いて便利な面があります。 USB 用無線子機を利用する 最近のノートブックでは、無線LANカード(PCカード規格)専用の接続端子が標準でついていないケースが増えています。その場合は、USB 2.0 端子へ直接つなぐタイプの無線子機を検討しても良いでしょう。ただし対応可能な機種が限られるので、事前調査が必要です。 PC Card から ExpressCard へと変換するアダプターが開発されています。 http //www.expresscard.org/web/site/wirelesswan.jsp#adap デスクトップ型PC の場合 デスクトップ型PCでは、よく一般に売られているPCカード規格(PCMCIA)に対応した無線LANカードの利用は、専用の接続端子が標準でついていないためできない場合があります。 この場合の対処としては、次のような方法が考えられます。 イーサネット・コンバーターを子機として利用する この種の製品は、国内の主要メーカーから販売されているので、入手は容易です。Webブラウザから設定が可能な機種もあります。 現在発売されている製品の中に、メーカーで Linux をサポートしている製品は見当たらないようですが、OS の違いによる影響はあまり受けないので、動作する可能性が高いと考えられます。 (注1) メーカーによって、接続設定に独自の仕様があると利用できない場合があるので、導入する場合は同一メーカーのアクセスポイントを利用する方が安心できます。 (注2) イーサネット・コンバーターでは、Webブラウザからの設定が可能となっている機種があります。ただし、機種によっては、購入した直後の最初の接続設定を Windows パソコンから行うことになる場合があります。 PCI バス用の無線 LAN ボードを追加する この場合、OS が自動認識する可能性は低いと思われますので、追加設定が必要かも知れません。 起動時 eth0 が存在しないというエラーが出る pcmcia サービスが起動する前に network サービスが起動してしまい、PCMCIA のネットワークカードを見つけられないために起こることがあります。起動スクリプトの起動順を変えて対処します。 まず、普段使うランレベル(Red Hat系なら5、Debian系なら2)の rcディレクトリに移動します。例) cd /etc/rc.d/rc5.d/ 次にそれぞれの起動の順番を変更します。頭の数字の順番に起動するので、pcmcia が network よりも先に起動するように数字を変えます。(root 権限が必要) mv S10network S11network mv S24pcmcia S10pcmcia 他の起動スクリプトとの兼ね合い上、なるべく早く起動するように network の数字は10前後にしておいたほうが無難です。 これで、次回起動時より、pcmcia(10) → network(11) の順番に起動するようになります。 [追加情報] 新しいノートPCは内蔵の無線LANを装備していますが、下記の情報が入手できればLinux(FedoraCore3で確認)で利用可能です。 % lspci | grep Atheros 02 02.0 Ethernet controller Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01) ディストリビューション の PCMCIA や Card Bus 対応情報を知るには? Linux PCMCIA Information Page Linux PCMCIA Supported Device List Linux PCMCIA HOWTO 日本語訳 武藤氏の 無線LAN動作状況 というページも実際的で役立ちます。 電波の受信レベルを GNOME に表示させることはできますか。 「ワイヤレス接続モニタ」という GNOME 付属のアクセサリーがあります。 デスクトップの下部に表示されるパネル上でマウスを右クリックし、 [パネルに追加] [インターネット] [ワイヤレス接続モニタ] を開くと、通知アイコンがパネルに追加されます。 内蔵無線 LAN (Atheros 社製)を使いたい Linux で Toshiba Tecra の内蔵無線LANを使う というページを参考にして、対応ドライバーを組み込み設定してください。 Atheros製無線LANチップセット用オープンソースドライバーが無料公開 ネットワーク用各種ユーティリティ LANにつながっているコンピュータを調べたい ping -b 192.168.0.255 や arp を使う。 arp - ARPテーブルの表示/設定を行う (@IT) 外部と接続しないのにホスト名、ドメイン名は必要なの?(ホスト名を変更したい) 適当なホスト名、ドメイン名をつけてやってください。example.com なんかは実際に使われないことになってるので、おすすめ。 インストール後にホスト名を変更したい場合は ITMedia のホスト名を変更したいを参照のこと。 最近のディストリビューションにはこの記事に出てくる linuxconf が収録されていない場合が多い。その場合は設定ファイルを直接編集。 サービスとポートの一覧表はないですか? /etc/services ファイルにあります。 あるポート番号を使っているプロセスを知りたい。 root で以下のコマンドを実行すれば調べられます。 lsof -i tcp ポート番号 fuser -v -n tcp ポート番号 netstat -anp | grep ポート番号 参考: 特定のポートをオープンしているプロセスを調べるには (@IT) ポートを使用しているユーザーを調べるには (@IT) DNS無しでLANのマシンの名前を逆引きしたい /etc/hosts ファイルに名前を書いておいてください。 192.168.0.2 hoge.hogehoge hoge 192.168.0.3 fuga.hogehoge fuga Windows のほうの C yenwindows yenhosts (9x系列)、%Systemroot% yensystem32 yendrivers yenetc yenhosts (NT系列) を同じ書式のファイルを用意すると、どちらからでも逆引きできるよ。 IP アドレスとドメイン名の変換がしたい。 host コマンドを使ってください。dig コマンドも使えます。 うまく行かない場合は /etc/resolv.conf ファイル や DNS の設定を確認してください。 digコマンドとは (@IT) 名前解決ができません!!(ip直指定では接続できます) /etc/resolv.conf に DNS サーバを指定していますか? nameserver 123.456.789.101 nameserver 123.456.789.102 先生!! ping コマンドが止まりません!! Ctrl+C で止めてください。あるいは -c オプションで回数を事前に指定 ($ ping -c 5 www.yahoo.co.jp など)。 ネットワークの経路を調べたいんですが。 traceroute www.yahoo.co.jp などとしてください。 traceroute - ネットワークの経路を調査する (@IT) DHCP接続でIPアドレスを再取得したい dhclient コマンドを使います。 $ su # dhclient -r でIPアドレスを解放し、つづいて再取得します。 # dhclient DHCPクライアントでIPアドレスを再取得するには (@IT) dhclient の man ページ 問題発生 ブラウザなどで名前解決が異常に遅いです アクセスの際に IPv6 で接続しようとするため、アドレス解決に時間がかかっていると考えられます。その結果、ページが表示されるまでの時間がかかり、ネットワーク環境が遅いと感じるのでしょう。 アプリケーション個別に IPv4 でアクセスする方法 Mozilla Firefox の場合 Konqueror の場合 w3m の場合は -4 オプションを付けて起動する事で IPv4 でアクセスする事ができます。 カーネルレベルで IPv6 を無効にする方法 modprobe.conf を編集する場合 /etc/modprobe.conf ファイルを変更します。/etc/modprobe.confで以下のように設定し、IPv6を無効化します。 alias net-pf-10 off alias ipv6 off ディストリビューションによっては、このファイルを新規に自分で作るので、同名ファイルがない場合があります。 /etc/modutils/aliases が存在している場合には、設定の変更はこのファイルより行います。 /etc/modutils/aliases の次の行のコメントを外します。 # alias net-pf-10 off# IPv6 変更後は次のようになります。 alias net-pf-10 off# IPv6 たとえ /etc/modules.conf と /etc/modprobe.d/aliases が存在しても、それらのファイルは変更せずそのままにしておきます。 How do I disable IPv6? (CentOS Wiki) 2007-09-22 FedoraでIPv6を無効化 (adsaria mood) 2008-05-25 UbuntuでIPv6を無効化 (同上) syscrl.conf を編集する場合 /etc/syscrl.conf ファイルを以下のように変更(または追加)してください。 net.ipv6.all.disable_ipv6=1 Ubuntu 9.04 JauntyでIPv6を無効(disable)にしたい (ほげおメモ) IPv6が動いているか調べる ifconfig コマンドでループパックデバイスを調べてください。 # ifconfig lo lo Link encap Local Loopback inet addr 127.0.0.1 Mask 255.0.0.0 inet6 addr 1/128 Scope Host ←この行があればIPV6が動作してます UP LOOPBACK RUNNING MTU 16436 Metric 1 RX packets 46 errors 0 dropped 0 overruns 0 frame 0 TX packets 46 errors 0 dropped 0 overruns 0 carrier 0 collisions 0 txqueuelen 0 RX bytes 3016 (3.0 KB) TX bytes 3016 (3.0 KB) Fedora Core VMware にインストールした時ネットワークが起動しない VMware上にインストールした時、DHCP で IPアドレスを取得する設定にしているとネットワークがリンクアップしていないため起動しません。 以下のファイルを編集します。 /etc/sysconfig/network-scripts/if-cfg[n] /etc/sysconfig/networking/devices/ifcfg-eth[n] -- ない場合は作成 [追加] check_link_down () { return 1; } Vine Linux 無線LANカードが利用できないのですが。 Vine Linux 3.0 の場合です。[アプリケーション] > [システム・ツール] > [ネットワークの管理] よりネットワークの設定を行えます。2.6 と比較して設定ツールは改善されたようですが、WEP KEY を有効にしている場合にはその設定項目が存在しないため自動接続ができず、設定が正常に完了できません。 そこで、 /etc/sysconfig/network-scripts/ifcfg-eth1 ファイルを適当なエディターで開くと、次のように(一例)記述されているでしょうから、 BOOTPROTO=dhcp ONBOOT=yes USERCTL=yes NAME="無線 LAN カード" DEVICE=eth0 ESSID=********** PEERDNS=yes さらに次の一行を追加してください。これでたいていは接続できるようになるでしょう。 KEY=s ************* Red Hat Linux Red Hat Linux 9 で再起動すると ADSL がしばらくの間つながらなくなってしまいます。 rp-pppoe パッケージのバグです。 パッケージのインストール時に起動スクリプトの設定は行われるのに終了スクリプトの設定が行われないため、シャットダウンもしくはリブート時に正常に切断がされず、プロバイダ側が異常終了と判断して五分間ぐらい接続を停止するのが原因です。 以下の方法で解決します。 # /sbin/chkconfig --del adsl # /sbin/chkconfig --add adsl このように一度スクリプトの設定を削除し、追加し直すことで終了時の設定が正常に設定し直されます。 KNOPPIX 無線LANカードの設定はどこで行なったらよいのですか。 無線LANカードをパソコンのPCカードスロットに差し込んだだけで直ぐに利用できる場合もありますが、カードの稼働ランプが点灯していなければ、無線LANの接続設定を実行する必要があります。 K アイコン(メインメニュー) > KNOPPIX > Network/Internet > ネットワークカードの設定 から接続設定を行ないます。この場合は、「DHCP のブロードキャストを使いますか?」という問いかけで「No」を選択し、ネットワークの各項目を再設定します。 出てくる入力フォームが分からない場合はWINDOWS(XP)で「ワイヤレスネットワークの表示」の「サポート」タブを確認する。 それぞれの問いかけにWINで確認した項目をそれぞれ入力する。 「IPアドレスを入力して下さい」 --- IPアドレス 「ネットワークマスクを入力して下さい」 --- サブネットマスク 「ブロードキャストアドレスを入力して下さい」 --- そのままで多分OK 「デフォルトゲートウェイを入力して下さい」 --- デフォルトゲートウェイ 「ネームサーバーを入力して下さい」 --- デフォルトゲートウェイ これで多分OK。 あとの不明な項目については「OK」で切り抜けると、自動設定が行なわれます。これで大抵は、ネットワークに接続可能となります。 White Box Enterprise Linux ネットワーク・タイムサーバーと時間を同期させることはできますか。 はい。日付と時刻の調整という設定画面で、「ネットワークタイムプロトコルを有効にする」という項目にチェックを入れます。 Red Hat Linux 9 や Fedora Core ではあらかじめ登録された中から選択するだけですが、WBEL では空欄となっているので明示的に指定する必要があります。 ntp.ring.gr.jp (Ring Server Project の NTP サーバによる国内サービス) time.nist.gov (National Institute of Standards and Technology- 米国標準技術局の運営) これらはその一例です。 ntp server http //www.asahi-net.or.jp/~mu6k-ski/ntp.html NTP The Network Time Protocol The Clock Mini-HOWTO (JF Project - 日本語訳)
https://w.atwiki.jp/lambda/pages/20.html
2010.12.31 いろんなWebページを参考に立ち上げているが、散逸の恐れもあるのでまとめておく。 母艦の設定 設定にはUbuntuが動くPCが必要です。 VMwarePlayerをインストールして、その上にUbuntuをインストールします。 VMware Playerからダウンロードしてインストール。 Ubuntu Japanese TeamのUbuntuの入手から「VMware用仮想マシンのダウンロード」を選んで「ubuntu-ja-8.04-vmware-i386.zip(仮想マシン本体)」をダウンロードする。 バージョンが古いが後でアップグレードできる。 VMwareはPCのUSBデバイスをPCと排他的利用を行うようです。この後にbeagleboard用UbuntuをSDCARDにインストールするのだが、SDCARDドライブをUbuntu(PC)で利用できるようになっている必要がある。 CPUがAMDの場合、AMD USB Filter Driverが入っていてVMware USB Arbitration Serviceが停止してしまうため、USBデバイスの共用ができない。 対策としてはAMD USB Filter Driverをuninstallする必要がある。 手順は以下。 1.Open the Windows registry, by clicking on Start Run and typing regedit 2.Navigate to the following location HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}. 3.In the right hand panel, if the the UpperFilters entry exists, then delete it. 4.Go to the location HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\. 5.Delete the usbfilter string. 6.Delete this file %system32%\drivers\usbfilter.sys. 7.Reboot your computer. 出展はHost USB device connections disabled error message is seen when launching VMware Workstation or VMware Player その他の手段として、 コントロールパネル→プログラムと機能→ATI Catalyst Install Manager→変更から「AMD USB フィルター ドライバ」を削除 というのがあるが、うちのPCでは異常終了してしまい、うまくいかなかった。 パッケージのアップデートと追加 ログイン後、まずは以下の手順でパッケージのアップデートを行います。このあとの作業でUbuntu Lucid以降のVerが走っている環境が必要となるのでアップデートとグレードアップは必須です。 1.[システム]-[システム管理]-[アップデートマネージャ]を開く。 2.[再チェック]ボタンをクリックし、パッケージ情報の更新を行う。 3.[アップデートをインストール]がクリックできる状態ならば、クリックしてアップデートをインストールする。 クリックできない場合、アップデートの必要はありません。 あるいは、[アプリケーション]-[アクセサリ]-[端末]を開き、以下のコマンドを実行することでアップデートを行うこともできます。 sudo apt-get update sudo apt-get upgrade 必要なアプリのインストール parted, fdisk, wget, mkfs.*, mkimage, md5sum, pv, p7zip-full をインストールする。 それぞれ、 which [アプリ名] で、インストールされているかどうかを確認し、されていなければ sudo apt-get insatll [アプリ名] でインストール。 mkimageはuboot-mkimageをインストールすること。 beagleboard-xMへUbuntuをインストール 手順はIchmy's Vertual_PCの「Beagleboard-xM で遊ぼうのこーなー(ソフト編)」に依る。 (1) 母艦での作業(最小環境のインストール) ① 中身が丸ごと消えてもいいmicroSDHCカードを用意し、アダプタに接続 ② 母艦Ubuntu起動し、適当な作業ディレクトリに移動し、以下のコマンドを実行してください (プレビルドされたイメージ取得) $ wget http //ynezz.ibawizard.net/beagleboard/maverick/ubuntu-10.10-r2-minimal-armel.tar.7z (チェックサム確認) $ md5sum ubuntu-10.10-r2-minimal-armel.tar.7z 6987c076236257227d71b8807cb67829 ubuntu-10.10-r2-minimal-armel.tar.7z (イメージ展開) $ 7za x ubuntu-10.10-r2-minimal-armel.tar.7z $ tar xf ubuntu-10.10-r2-minimal-armel.tar $ cd ubuntu-10.10-r2-minimal-armel (SDへの書込) $ ./setup_sdcard.sh --mmc /dev/sdb --uboot beagle (2) beagleboard-xm 起動 ① 先ほど作成したmicroSDHCカードをbeagleboard-xmにセット ② 母艦とシリアルケーブルをつなぎ、端末エミュレータソフトを起動 ③ 電源をつなげばBeagleboard-xMが起動します。 初期ユーザー名は「 ubuntu 」初期パスワードは「 temppwd 」です。 起動後、パスワード変更ください ④ お好みでDVI-D入力端子CRTとHDMI→DVI-D変換ケーブルでつなぎ、 USBキーボードもつなげば 画面からもログインし、コマンドが打てます。 ( CUI です ) (3) beagleboard-xm での初期設定 ① 内蔵イーサネットを有効にします 内蔵イーサは usb1 として認識されています。 /etc/network/interfaces に以下の行を追加します auto usb1 iface usb1 inet dhcp これはDHCPの例ですが、お好みで固定IPに設定してもOKです。 固定IPとする場合の設定は以下。 auto usb1 iface usb1 inet static address 192.168.1.60 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1 ② パッケージのアップデート $ sudo aptitude update $ sudo aptitude safe-upgrade ※aptitudeはインストールされていない?どうだっけ? ③ timezoneの設定 以下のコマンドを実行し、 Asia/Tokyo に設定する $ sudo dpkg-reconfigure tzdata Ubuntu Marverickへの設定 新しいユーザを追加 $ sudo adduser newname パスワードをきかれるので設定する 新しいユーザをsudoerにする $ sudo visudo user名rootの設定がすでにあるので、それにならい書く rootALL=(ALL) ALL newnameALL=(ALL) ALL 一度再起動する $ sudo reboot 新しいユーザの方でログインして、古いuser ubuntuを削除する $ sudo deluser ubuntu aptをアップデートして、それからopenssh serverを起動してリモートログインできるようにする $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install openssh-server ※upgradeはインストールされているパッケージソフトを最新化する。 非常に時間がかかる場合があるので注意。 sshdが起動しているのを確認する $ ps aux | grep sshd DHCPの場合にはIPアドレスを確認 $ sudo ifconfig 別のマシンからuser名を指定してログインできる $ ssh newname@192.168.1.60 ファイル転送はscpを使う $ scp [送るファイル] newname@192.168.1.60 [送り先ディレクトリ(ファイル名)] 例 $ scp index.html newname@192.168.1.60 . ←別マシンのカレントディレクトリにあるindex.htmlを接続先のカレントディレクトリにコピーする。 ロードモジュール関連 モジュールの強制ロード $ sudo modprobe [module] ロードされているモジュールを確認 $ lsmod インストールされているモジュールのリスト $ modprobe -l UVCカメラ接続でモジュールがうまくロードできないとき $ sudo modprobe v4l2-common $ sudo modprobe v4l2-int-device $ sudo modprobe v4l2-mem2mem 2011.12.18追記 現在、BeagleBoardUbuntuのバージョンは Oneiric 11.10 Natty 11.04 がリリースされてる。 BeagleBoardUbuntu インストール手順は上記リンク内の4.2Demo Imageからの記述通りに行う。 11.10は問題が残っている様子。11.04をインストールした。 イーサポート名はeth0 sshはDemo Imageに含まれている。 VMWare PlayerへのUbuntuデスクトップのインストール(CDイメージからのインストール) VMWare Playerの「新規仮想マシンの作成」から進むと、CDイメージを指定できる。 ここから進むとほぼすべて自動でインストールが進む。 インストールが完了すると英語環境でシステムが立ち上がってしまうので、Language Supportを立ち上げる。 すると↓こんなダイアログが立ち上がる。Installを選びたいがRemind Me Laterを選ぶ。 ちなみに日本語だと↓こんな感じ。 その後、日本語環境をアクティブにするのだが、手順が明確ではない。確か、textタブを選んで日本語を有効にしたような覚えがある。 複数言語を有効にし、選択ボックスの上から順に優先順位が高い。 日本語を選べるようにしてから日本語を一番上に移動させ、Apply system-Wide..(システム全体に適用)を選ぶ。 日本語を有効にすると、ログイン画面でユーザーを選びパスワードを入れる画面になると、このようになり、下のバー部分で言語が選べる。 インストール後最最初のログイン時にも選べたかも知れないが覚えていない。
https://w.atwiki.jp/lunaserver-g/pages/15.html
※フォーラムに書きこむ前に以下を熟読下さい※ 【不具合に関して】 フォーラムの不具合報告スレに書き込みをお願い致します。 その際、なにがどうなのか詳細に記載してください。 【要望・アイディアに関して】 フォーラムのアイディア募集スレに書き込みをお願い致します。 当鯖は本鯖&L2J準拠なのでそれにそぐわない要望は一切受け付けません スキル・装備の強化も一切受け付けません 効率&自己中な要望も却下です メリット・デメリットを提示して、多数の賛同を貰えると採用にも繋がりやすいと思います。 【~の効果がない。~の効果が落ちてる】 まず、実験を行った上でデータサンプルを提示してください。 当鯖は基本的に告知なしで仕様変更はしません。 受け側のステータス・装備・スキル・バフ・その他関与するアイテム 攻撃側のステータス・装備・スキル・バフ・その他関与する条件 以上を元に、データサンプルを採ってください。 【フォーラム】 http //bb2.atbb.jp/lunaserver-g/
https://w.atwiki.jp/minelaurant/pages/27.html
citizens dtTraders FarmAssist iConomy LunaChat Multverse-Core Multverse-Portals PermissionsEx SignCasino ScoreboardStates Shopkeepers SimpleHat SimpleSort TreeAssist Vault
https://w.atwiki.jp/spoutserver/
蒟蒻Serverは多くのプラグインを導入したBukkitServerです。 初めてこのサーバーに来た方はサーバールールを確認後コチラをご覧下さい。→初めての方へ サーバーアドレスlnt.dyndns.info リアルタイムMAPhttp //lnt.dyndns.info 10800 サーバー管理者LNTakeshi ログイン/サーバー状況
https://w.atwiki.jp/labosever/pages/24.html
チャットに色を。 simple colored chat http //forums.bukkit.org/threads/chat-simple-colored-chat-v7-bringing-colors-to-your-server-1317.29948/ 期待。xxxがban_axeをもってやってくる! ban axe http //forums.bukkit.org/threads/admn-fun-banaxe-ban-and-have-fun-1337.43186/ 死んだらitem保護 tomb http //forums.bukkit.org/threads/fun-tp-tomb-0-7-make-people-remember-you-after-your-death-1000-permissions-all-economy.14819/ lag予防? no lag http //forums.bukkit.org/threads/fix-admn-nolagg-v1-43-prevent-common-lag-causes-on-your-server-1337.36986/ sign変化系 使いやすそうか? quick sign http //dev.bukkit.org/server-mods/quicksign/ 天気いじれる 検討 simpleweather http //forums.bukkit.org/threads/admn-simpleweather-v-0-1-change-weather-w-commands-1337.44022/ IDわかる 便利そう http //forums.bukkit.org/threads/admn-chat-blockid-v1-0-simple-id-finder-1337.40577/ 便利そう help all http //forums.bukkit.org/threads/admn-fix-gen-info-helpme-v1-2-the-best-helping-plugin-1337.42913/ ウールおじさん配置に。 wool giver http //forums.bukkit.org/threads/admn-woolgiver-v0-1-gives-you-colored-wool-860.22455/ こっそり http //forums.bukkit.org/threads/mech-admn-hidelogin-v1-10-hide-login-out-messages-1317.22919/ 土地生成ができる http //forums.bukkit.org/threads/admn-misc-worldgenerationcontrol-v2-5-generate-areas-of-your-world-at-will-tested-w-1-9-1337.30238/ 季節導入 興味あり http //dev.bukkit.org/server-mods/seasons/ リアルタイムmap 重いかな? いい名前。 dynmap http //forums.bukkit.org/threads/misc-dynmap-v0-23-realtime-minecraft-maps-1185.489/ トーチがヘッドライトになるかも http //forums.bukkit.org/threads/mech-portable-torches-v1-04-portable-headlamp-lighting-740.9601/ 所持金がweb上に表示される? http //forums.bukkit.org/threads/info-web-iconomy-webwealth-v0-1-a-simple-table-to-show-wealth-740.15859/
https://w.atwiki.jp/fackingserver/pages/8.html
メニュー siguma server へようこそ!! serverの入り方 BAN条件&ルール
https://w.atwiki.jp/qtarogameserver/pages/20.html
貨幣・経済・報奨金 Economics https //umod.org/plugins/economics 権限(Permission) economics.balance--プレイヤーがbalance他のプレイヤーに対してコマンドを使用できるようにします economics.deposit-- プレイヤーがdepositコマンドを使用できるようにします economics.depositall-- プレイヤーがdepositコマンドを使用してすべてのプレイヤーに金額を入金できるようにします economics.setbalance-- プレイヤーがsetbalanceコマンドを使用できるようにします economics.setbalanceall-- プレイヤーがsetbalanceコマンドを使用してすべてのプレイヤーのお金を設定できるようにします economics.transfer-- プレイヤーがtransferコマンドを使用できるようにします economics.transferall-- プレーヤーがコマンドを使用して、transfer接続されているすべてのプレーヤーに金額を転送できるようにします economics.withdraw-- プレイヤーがwithdrawコマンドを使用できるようにします economics.withdrawall-- プレイヤーがwithdrawコマンドを使用してすべてのプレイヤーから金額を引き出すことができます economics.wipe-- プレーヤーがecowipeコマンドを使用してデータを消去できるようにします チャットコマンド /balance-- 残高を確認します(許可を必要とせず、使用しません) /balance player name or id [名前]} -- プレイヤーのバランスを確認します(economics.balance が必要) /deposit player name or id | * amount -- [名前] プレイヤーに [金額] を入金します(economics.deposit が必要です) /setbalance player name or id | * amount -- [名前] プレーヤーの残高を [金額] に設定します(economics.setbalance が必要) /transfer player name or id | * amount -- [金額] を [名前] プレイヤーに送金します(economics.transfer が必要です) /withdraw player name or id | * amount [名前] -- プレイヤーから [金額] を引き出します(economics.withdraw が必要) /ecowipe --保存されているすべての経済データ (残高を含む) を消去します(economics.wipe が必要) Server Rewards https //umod.org/plugins/server-rewards RPで物が買える・売ることができる 販売アイテム追加 チャット欄で /rewards add item コスト Money Time https //umod.org/plugins/money-time 各権限を設定して、与える倍率を調整できる Permission-based mulitipliers" { "donor" 2.5, "vip" 3.0, "Tester" 10.0 } 作った権限名をそれぞれのグループに割り当てればいい 権限割り当て無しグループは、 "Base payout amount" 100, "Payout interval (seconds)" 600, の数値が反映される(この例では600秒(10分)で100もらえる) Gather Rewards https //umod.org/plugins/gather-rewards チャットコマンド /gatherrewards [value] [amount] [value] を、変更したい構成に表示されている内容に置き換えます。 フレンドの場合、値は「プレイヤーのフレンド」ではなく「フレンド」です。 クランメンバーの場合、値は「クランメンバー」ではなく「クラン」です。 コンソールコマンド gatherrewards [value] [amount] ImageLibrary https //umod.org/plugins/image-library 画像ライブラリは、他のプラグインが UI で使用する画像を保存および管理するために利用できるツールです。それ自体では本当の目的はありません。
https://w.atwiki.jp/red5server/pages/39.html
Red5のオブジェクト消失条件を探ってみる。 ある意味動作検証でもあります。 この動作検証の結果としては、いまのところ問題はなかったです。 まず、コードから、 基本的なApplicationクラス(ApplicationAdapter継承)をつくって、様子をみます。 package com.taktod.red5test; import java.lang.ref.WeakReference;import java.util.HashMap;import java.util.Iterator;import java.util.Map; import org.red5.server.adapter.ApplicationAdapter;import org.red5.server.api.IClient;import org.red5.server.api.IConnection;import org.red5.server.api.IScope;import org.red5.server.api.Red5;import org.red5.server.api.stream.IBroadcastStream; /** * Red5アプリケーション * @author taktod */public class Application extends ApplicationAdapter{private int connNum;private int scopeNum;private int clientNum;private Map String, WeakReference Object dataHolder;/** * アプリケーション */public Application() {dataHolder = new HashMap String, WeakReference Object ();connNum = 0;scopeNum = 0;clientNum = 0;}/** * アプリケーションに接続したときの動作 */@Overridepublic boolean appConnect(IConnection conn, Object[] arg1) {if(conn.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}IConnection conn2 = Red5.getConnectionLocal();if(conn2.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn2.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}System.out.println("appConnect conn " + conn.getAttribute("conn") + " conn2 " + conn2.getAttribute("conn"));clearMap();return super.appConnect(conn, arg1);}/** * アプリケーションから切断したときの動作 */@Overridepublic void appDisconnect(IConnection conn) {if(conn.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}IConnection conn2 = Red5.getConnectionLocal();if(conn2.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn2.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}System.out.println("appDisconnect conn " + conn.getAttribute("conn") + " conn2 " + conn2.getAttribute("conn"));super.appDisconnect(conn);clearMap();}/** * アプリケーションに参加したときの動作? */@Overridepublic boolean appJoin(IClient client, IScope scope) {if(client.getAttribute("client") == null) {clientNum ++;Object o = new HoldData("client" + clientNum);client.setAttribute("client", o);dataHolder.put("client" + clientNum, new WeakReference Object (o));}if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("appJoin client " + client.getAttribute("client") + " scope " + scope.getAttribute("scope"));clearMap();return super.appJoin(client, scope);}/** * アプリケーションから離れたときの動作 */@Overridepublic void appLeave(IClient client, IScope scope) {if(client.getAttribute("client") == null) {clientNum ++;Object o = new HoldData("client" + clientNum);client.setAttribute("client", o);dataHolder.put("client" + clientNum, new WeakReference Object (o));}if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("appLeave client " + client.getAttribute("client") + " scope " + scope.getAttribute("scope"));super.appLeave(client, scope);clearMap();}/** * アプリケーションがはじまったときの動作 */@Overridepublic boolean appStart(IScope scope) {if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("appStart scope " + scope.getAttribute("scope"));clearMap();return super.appStart(scope);}/** * アプリケーションが停止するときの動作 */@Overridepublic void appStop(IScope scope) {if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("appStop scope " + scope.getAttribute("scope"));super.appStop(scope);clearMap();}/** * ルームに接続するときの動作 */@Overridepublic boolean roomConnect(IConnection conn, Object[] arg1) {if(conn.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}IConnection conn2 = Red5.getConnectionLocal();if(conn2.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn2.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}System.out.println("roomConnect conn " + conn.getAttribute("conn") + " conn2 " + conn2.getAttribute("conn"));clearMap();return super.roomConnect(conn, arg1);}/** * ルームから切断するときの動作 */@Overridepublic void roomDisconnect(IConnection conn) {if(conn.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}IConnection conn2 = Red5.getConnectionLocal();if(conn2.getAttribute("conn") == null) {connNum ++;Object o = new HoldData("conn" + connNum);conn2.setAttribute("conn", o);dataHolder.put("conn" + connNum, new WeakReference Object (o));}System.out.println("roomDisconnect conn " + conn.getAttribute("conn") + " conn2 " + conn2.getAttribute("conn"));super.roomDisconnect(conn);clearMap();}/** * ルームに参加するときの動作? */@Overridepublic boolean roomJoin(IClient client, IScope scope) {if(client.getAttribute("client") == null) {clientNum ++;Object o = new HoldData("client" + clientNum);client.setAttribute("client", o);dataHolder.put("client" + clientNum, new WeakReference Object (o));}if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("roomJoin client " + client.getAttribute("client") + " scope " + scope.getAttribute("scope"));clearMap();return super.roomJoin(client, scope);}/** * ルームから離れるときの動作 */@Overridepublic void roomLeave(IClient client, IScope scope) {if(client.getAttribute("client") == null) {clientNum ++;Object o = new HoldData("client" + clientNum);client.setAttribute("client", o);dataHolder.put("client" + clientNum, new WeakReference Object (o));}if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("roomLeave client " + client.getAttribute("client") + " scope " + scope.getAttribute("scope"));super.roomLeave(client, scope);clearMap();}/** * ルーム処理が始まったときの動作 */@Overridepublic boolean roomStart(IScope scope) {if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("roomStart scope " + scope.getAttribute("scope"));clearMap();return super.roomStart(scope);}/** * ルーム処理が終わったときの動作 */@Overridepublic void roomStop(IScope scope) {if(scope.getAttribute("scope") == null) {scopeNum ++;Object o = new HoldData("scope" + scopeNum);scope.setAttribute("scope", o);dataHolder.put("scope" + scopeNum, new WeakReference Object (o));}System.out.println("roomStop scope " + scope.getAttribute("scope"));super.roomStop(scope);clearMap();}/** * 放送停止イベント */@Overridepublic void streamBroadcastClose(IBroadcastStream stream) {System.out.println("streamBroadcastClose stream " + stream.getName());super.streamBroadcastClose(stream);clearMap();}/** * 放送開始イベント */@Overridepublic void streamBroadcastStart(IBroadcastStream stream) {System.out.println("streamBroadcastStart stream " + stream.getName());super.streamBroadcastStart(stream);clearMap();}/** * ライブ放送開始イベント */@Overridepublic void streamPublishStart(IBroadcastStream stream) {System.out.println("streamPublishStart stream " + stream.getName());super.streamPublishStart(stream);clearMap();}/** * レコード放送開始イベント */@Overridepublic void streamRecordStart(IBroadcastStream stream) {System.out.println("streamRecordStart stream " + stream.getName());super.streamRecordStart(stream);clearMap();}/** * マップデータを消去し内容を確認する。 * @param map */private void clearMap() {System.out.println("before " + dataHolder.keySet());System.gc();Iterator String iter = dataHolder.keySet().iterator();while(iter.hasNext()) {String key = iter.next();if(dataHolder.get(key).get() == null) {iter.remove();}}System.out.println("after " + dataHolder.keySet());}/** * 保持オブジェクトクラス */private class HoldData {private String str;public HoldData(String str) {this.str = str;}@Overridepublic String toString() {return "HoldData " + str;}}} 実行結果は以下のとおり。 かなり長いですが... 起動 appStart scope HoldData scope1 before [scope1] after [scope1] 接続1 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn1 conn2 HoldData conn1 before [scope1, conn1] after [scope1, conn1] appJoin client HoldData client1 scope HoldData scope1 before [client1, scope1, conn1] after [client1, scope1, conn1] 切断1 appDisconnect conn HoldData conn1 conn2 HoldData conn1 before [client1, scope1, conn1] after [client1, scope1, conn1] appLeave client HoldData client1 scope HoldData scope1 before [client1, scope1, conn1] after [client1, scope1, conn1] 接続2 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn2 conn2 HoldData conn2 before [client1, conn2, scope1, conn1] after [conn2, scope1] appJoin client HoldData client2 scope HoldData scope1 before [client2, conn2, scope1] after [client2, conn2, scope1] 接続3 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn3 conn2 HoldData conn3 before [client2, conn2, conn3, scope1] after [client2, conn2, conn3, scope1] appJoin client HoldData client3 scope HoldData scope1 before [client3, client2, conn2, conn3, scope1] after [client3, client2, conn2, conn3, scope1] 切断3 appDisconnect conn HoldData conn3 conn2 HoldData conn3 before [client3, client2, conn2, conn3, scope1] after [client3, client2, conn2, conn3, scope1] appLeave client HoldData client3 scope HoldData scope1 before [client3, client2, conn2, conn3, scope1] after [client3, client2, conn2, conn3, scope1] 切断2 appDisconnect conn HoldData conn2 conn2 HoldData conn2 before [client3, client2, conn2, conn3, scope1] after [client2, conn2, scope1] appLeave client HoldData client2 scope HoldData scope1 before [client2, conn2, scope1] after [client2, conn2, scope1] ルーム接続実験 接続4 roomStart scope HoldData scope2 before [client2, conn2, scope2, scope1] after [scope2, scope1] [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [Scope@519549e Depth = 2, Path = /default/test , Name = 135 ] appConnect conn HoldData conn4 conn2 HoldData conn4 before [conn4, scope2, scope1] after [conn4, scope2, scope1] appJoin client HoldData client4 scope HoldData scope1 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] roomConnect conn HoldData conn4 conn2 HoldData conn4 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] roomJoin client HoldData client4 scope HoldData scope2 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] 切断4 roomDisconnect conn HoldData conn4 conn2 HoldData conn4 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] roomLeave client HoldData client4 scope HoldData scope2 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] roomStop scope HoldData scope2 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] appDisconnect conn HoldData conn4 conn2 HoldData conn4 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] appLeave client HoldData client4 scope HoldData scope1 before [conn4, client4, scope2, scope1] after [conn4, client4, scope2, scope1] [ERROR] [NioProcessor-1] org.red5.io.amf.Input - Error loading class com.taktod.red5test.Application$HoldData 接続5 roomStart scope HoldData scope3 before [conn4, client4, scope3, scope2, scope1] after [scope3, scope1] [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [Scope@61b00766 Depth = 2, Path = /default/test , Name = 135 ] appConnect conn HoldData conn5 conn2 HoldData conn5 before [conn5, scope3, scope1] after [conn5, scope3, scope1] appJoin client HoldData client5 scope HoldData scope1 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] roomConnect conn HoldData conn5 conn2 HoldData conn5 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] roomJoin client HoldData client5 scope HoldData scope3 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] 接続6 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [Scope@61b00766 Depth = 2, Path = /default/test , Name = 135 ] appConnect conn HoldData conn6 conn2 HoldData conn6 before [conn6, conn5, client5, scope3, scope1] after [conn6, conn5, client5, scope3, scope1] appJoin client HoldData client6 scope HoldData scope1 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] roomConnect conn HoldData conn6 conn2 HoldData conn6 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] roomJoin client HoldData client6 scope HoldData scope3 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] 切断6 roomDisconnect conn HoldData conn6 conn2 HoldData conn6 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] roomLeave client HoldData client6 scope HoldData scope3 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] appDisconnect conn HoldData conn6 conn2 HoldData conn6 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] appLeave client HoldData client6 scope HoldData scope1 before [conn6, conn5, client5, client6, scope3, scope1] after [conn6, conn5, client5, client6, scope3, scope1] 切断5 roomDisconnect conn HoldData conn5 conn2 HoldData conn5 before [conn6, conn5, client5, client6, scope3, scope1] after [conn5, client5, scope3, scope1] roomLeave client HoldData client5 scope HoldData scope3 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] roomStop scope HoldData scope3 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] appDisconnect conn HoldData conn5 conn2 HoldData conn5 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] appLeave client HoldData client5 scope HoldData scope1 before [conn5, client5, scope3, scope1] after [conn5, client5, scope3, scope1] 接続7 [ERROR] [NioProcessor-1] org.red5.io.amf.Input - Error loading class com.taktod.red5test.Application$HoldData roomStart scope HoldData scope4 before [scope4, conn5, client5, scope3, scope1] after [scope4, scope1] [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [Scope@541b55f2 Depth = 2, Path = /default/test , Name = 135 ] appConnect conn HoldData conn7 conn2 HoldData conn7 before [scope4, conn7, scope1] after [scope4, conn7, scope1] appJoin client HoldData client7 scope HoldData scope1 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] roomConnect conn HoldData conn7 conn2 HoldData conn7 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] roomJoin client HoldData client7 scope HoldData scope4 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] 切断7 roomDisconnect conn HoldData conn7 conn2 HoldData conn7 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] roomLeave client HoldData client7 scope HoldData scope4 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] roomStop scope HoldData scope4 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] appDisconnect conn HoldData conn7 conn2 HoldData conn7 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] appLeave client HoldData client7 scope HoldData scope1 before [client7, scope4, conn7, scope1] after [client7, scope4, conn7, scope1] 放送開始実験 接続8 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn8 conn2 HoldData conn8 before [client7, scope4, conn7, conn8, scope1] after [conn8, scope1] appJoin client HoldData client8 scope HoldData scope1 before [client8, conn8, scope1] after [client8, conn8, scope1] 接続8視聴開始 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Remembering client buffer on stream 2000 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Remembering client buffer on stream 2000 接続9 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn9 conn2 HoldData conn9 before [client8, conn8, conn9, scope1] after [client8, conn8, conn9, scope1] appJoin client HoldData client9 scope HoldData scope1 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 放送開始 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Remembering client buffer on stream 0 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Stream start [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect streamPublishStart stream 87bc6e26-40b4-4ea3-8735-cce386d6c9de before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] streamBroadcastStart stream 87bc6e26-40b4-4ea3-8735-cce386d6c9de before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 放送停止 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Close [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect streamBroadcastClose stream 87bc6e26-40b4-4ea3-8735-cce386d6c9de before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 録画放送開始 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Remembering client buffer on stream 0 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Stream start [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Consumer connect streamRecordStart stream f8451502-48e6-45f2-84f1-3ccb5b7b8029 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] streamBroadcastStart stream f8451502-48e6-45f2-84f1-3ccb5b7b8029 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 録画放送停止 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Close [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect streamBroadcastClose stream f8451502-48e6-45f2-84f1-3ccb5b7b8029 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 録画放送開始 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Remembering client buffer on stream 0 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Stream start [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider connect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Consumer connect streamRecordStart stream 5a4ebd67-e3f3-4729-806a-6c0540bf6438 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] streamBroadcastStart stream 5a4ebd67-e3f3-4729-806a-6c0540bf6438 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 録画放送停止 [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Close [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect [INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect streamBroadcastClose stream 5a4ebd67-e3f3-4729-806a-6c0540bf6438 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 切断9 appDisconnect conn HoldData conn9 conn2 HoldData conn9 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] appLeave client HoldData client9 scope HoldData scope1 before [client8, client9, conn8, conn9, scope1] after [client8, client9, conn8, conn9, scope1] 切断8 appDisconnect conn HoldData conn8 conn2 HoldData conn8 before [client8, client9, conn8, conn9, scope1] after [client8, conn8, scope1] appLeave client HoldData client8 scope HoldData scope1 before [client8, conn8, scope1] after [client8, conn8, scope1] 接続10 [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler - Connecting to [WebScope@32e62121 Depth = 1, Path = /default , Name = test ] appConnect conn HoldData conn10 conn2 HoldData conn10 before [client8, conn10, conn8, scope1] after [conn10, scope1] appJoin client HoldData client10 scope HoldData scope1 before [conn10, client10, scope1] after [conn10, client10, scope1] 終わり 基本的な動作としては、 Red5を起動し、アプリケーションが読み込まれたら →appStart ユーザーが接続した場合 appConnect→appJoin ユーザーが切断した場合 appDisconnect→appLeave ルームに接続した場合 roomStart→appConnect→appJoin→roomConnect→roomJoin 他ユーザーがさらにルームに接続した場合 appConnect→appJoin→roomConnect→roomJoin ルームから切断した場合 roomDisconnect→roomLeave→roomStop→appDisconnect→appLeave 多数ユーザーがいる状態で切断したとき roomLeave→roomStop→appDisconnect→appLeave 放送に関して このログをみる限りは、play状態になって待機状態になると、バッファデータの取得待ちになる(特にApplicationAdapterで取得できるイベントなし) live publish状態になると streamPublishStart→streamBroadcastStart record publish状態になると streamRecordStart→streamBroadcastStart publishを停止すると streamBroadcastClose が呼ばれる。 Mapに持たせたデータによると、この検証結果によると、Client、Connection、Scopeともに、必要あれば、存在し必要なければ、きちんと消えていました。 scopeデータだけは、別でおこなった回線を無理矢理引っこ抜くや、処理上で別のユーザーにちょっかいをかける。(client.disconnectを走らせる。)重い処理を実施する。 等をおこなったときに、のこったことがありました。(詳細は気が向いたら検証します。) 以下は個人的な感想 アプリケーションを組むときの方針としては、 Joinで接続完了なので、そのあとでアプリベースのログイン処理を入れる等する。 Leaveでログアウト開始なので、はじめの時点でログアウト処理を入れる等する。 処理がおもくなったりした場合には、Red5.getConnectionLocalのデータが上書きされる可能性があるので、なるべくRed5.setConnectionLocalでただしい値に戻してから 処理を継承元に渡した方がいいかなと思います。